package com.echo.ssm.redis;
import java.util.List;
import java.util.Map;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

public final class RedisUtil {

	// Redis的端口号
	private static int PORT = 6379;
	// 访问密码
	private static String AUTH = null;
	// 可用连接实例的最大数目，默认值为8；
	// 如果赋值为-1，则表示不限制；如果pool已经分配了maxActive个jedis实例，则此时pool的状态为exhausted(耗尽)。
	private static int MAX_TOTAL = 7;

	// 控制一个pool最多有多少个状态为idle(空闲的)的jedis实例，默认值也是8。
	private static int MAX_IDLE = 7;

	// 等待可用连接的最大时间，单位毫秒，默认值为-1，表示永不超时。如果超过等待时间，则直接抛出JedisConnectionException；
	private static int MAX_WAIT = 10000;

	private static int TIMEOUT = 10000;

	// 在borrow一个jedis实例时，是否提前进行validate操作；如果为true，则得到的jedis实例均是可用的；
	private static boolean TEST_ON_BORROW = true;

	private static JedisPool jedisPool = null;

	public static final int DATABASE =0;// 数据库

	/**
	 * 初始化Redis连接池
	 */
	static {
		try {
			JedisPoolConfig config = new JedisPoolConfig();
			config.setMaxTotal(MAX_TOTAL);
			// 最小能够保持空闲状态的对象数
			config.setMinIdle(20);
			// 最大能够保持空闲状态的对象数
			config.setMaxIdle(MAX_IDLE);
			config.setMaxWaitMillis(MAX_WAIT);
			// 在borrow一个jedis实例时，是否提前进行alidate操作；如果为true，则得到的jedis实例均是可用的；
			config.setTestOnBorrow(TEST_ON_BORROW);
			// 在还会给pool时，是否提前进行validate操作
			config.setTestOnReturn(TEST_ON_BORROW);
			// jedisPool = new JedisPool(config, "172.17.10.100", PORT, TIMEOUT,
			// AUTH, DATABASE);
			jedisPool = new JedisPool(config,"192.168.3.109",6379,TIMEOUT,AUTH,DATABASE);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 获取Jedis实例
	 * 
	 * @return
	 */
	public synchronized static Jedis getJedis() {
		Jedis jedis = null;
		try {
			if (jedisPool != null) {
				jedis = jedisPool.getResource();
				return jedis;
			} else {
				return null;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		} finally {
			jedis.close();

		}
	}

	/**
	 * 释放jedis资源
	 * 
	 * @param jedis
	 */
	public static void returnResource(final Jedis jedis) {
		if (jedis != null) {
			jedis.close();
		}
	}

	/**
	 * 查询数据
	 */
	public static String findStr(String key) {
		Jedis jedis = null;
		try {
			jedis = jedisPool.getResource();
			return jedis.get(key);
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		} finally {
			jedis.close();
		}
	}

	/**
	 * 查询特定字符串
	 */
	public String findSubStr(String key, Integer startOffset, Integer endOffset) {
		Jedis jedis = null;
		try {
			jedis = jedisPool.getResource();
			return jedis.getrange(key, startOffset, endOffset);
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		} finally {
			jedis.close();
		}
	}

	/**
	 * 向缓存中设置字符串内容 新增数据|修改
	 * 
	 * @param key
	 *            key
	 * @param value
	 *            value
	 * @return
	 * @throws Exception
	 */
	public static int addStr(String key, String value) throws Exception {
		Jedis jedis = null;
		try {
			jedis = jedisPool.getResource();
			jedis.set(key, value);
			return 0;
		} catch (Exception e) {
			e.printStackTrace();
			return -1;
		} finally {
			jedis.close();
		}
	}

	/**
	 * 删除缓存中得对象，根据key
	 * 
	 * @param key
	 * @return
	 */
	public static int delStr(String key) {
		Jedis jedis = null;
		try {
			jedis = jedisPool.getResource();
			jedis.del(key);
			return 0;
		} catch (Exception e) {
			e.printStackTrace();
			return -1;
		} finally {
			jedis.close();
		}
	}

	public static int addList(String key, String value) throws Exception {
		Jedis jedis = null;
		try {
			jedis = jedisPool.getResource();
			jedis.lpush(key, value);
			return 0;
		} catch (Exception e) {
			e.printStackTrace();
			return -1;
		} finally {
			jedis.close();
		}
	}

	/**
	 * 获取List数据 Author： Huang fengge Date:2015年11月27日
	 * 
	 * @param key
	 * @param start
	 * @param end
	 * @return
	 * @throws Exception
	 *             List<String>
	 */
	public static List<String> getList(String key, int start, int end) throws Exception {
		Jedis jedis = null;
		try {
			jedis = jedisPool.getResource();
			List<String> list = jedis.lrange(key, start, end);
			return list;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		} finally {
			jedis.close();
		}

	}

	/**
	 * 存放Map集合 Author： Huang fengge Date:2015年11月27日
	 * 
	 * @param key
	 * @param start
	 * @param end
	 * @return
	 * @throws Exception
	 *             List<String>
	 */
	public static String setMap(String key, Map<String, String> map) throws Exception {
		Jedis jedis = null;
		try {
			jedis = jedisPool.getResource();
			return jedis.hmset(key, map);
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		} finally {
			jedis.close();
		}
	}

	/**
	 * 获取Map集合 Author： Huang fengge Date:2015年11月27日
	 * 
	 * @return
	 * @throws Exception
	 *             Map<String,String>
	 */
	public static List<String> getMap(String key, String hKey) throws Exception {
		Jedis jedis = null;
		try {
			jedis = jedisPool.getResource();
			List<String> list = jedis.hmget(key, hKey);
			return list;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		} finally {
			jedis.close();
		}
	}

	/**
	 * key是否存在 Author： Huang fengge Date:2015年11月27日
	 * 
	 * @param key
	 * @return
	 * @throws Exception
	 *             boolean
	 */
	public static boolean exists(String key) throws Exception {
		Jedis jedis = null;
		boolean isTrue = false;
		try {
			jedis = jedisPool.getResource();
			isTrue = jedis.exists(key);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			jedis.close();
		}
		return isTrue;
	}

	/**
	 * map里面的hashkey是否存在 Author： Huang fengge Date:2015年12月1日
	 * 
	 * @param key
	 * @return
	 * @throws Exception
	 *             boolean
	 */
	public static boolean hexists(String key, String hashKey) throws Exception {
		Jedis jedis = null;
		boolean isTrue = false;
		try {
			jedis = jedisPool.getResource();
			isTrue = jedis.hexists(key, hashKey);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			jedis.close();
		}
		return isTrue;
	}

	/**
	 * 设置缓存key的过期时间 Author： Huang fengge Date:2015年11月27日
	 * 
	 * @param key
	 * @param milliseconds
	 * @throws Exception
	 *             void
	 */
	public static void pexpire(String key, long milliseconds) throws Exception {
		Jedis jedis = null;
		try {
			jedis = jedisPool.getResource();
			jedis.pexpire(key, milliseconds);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			jedis.close();
		}
	}

	/**
	 * 获取list的长度 Author： Huang fengge Date:2015年11月30日
	 * 
	 * @return
	 * @throws Exception
	 *             int
	 */
	public static int getListLength(String key) throws Exception {
		Jedis jedis = null;
		int len = 0;
		try {
			jedis = jedisPool.getResource();
			long l = jedis.llen(key);
			return len = (int) l;
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			jedis.close();
		}
		return len;
	}

	/**
	 * reids获取key的值 Author： Huang fengge Date:2016年3月29日
	 * 
	 * @param key
	 * @return String
	 */
	public String get(final String key) {
		Jedis jedis = null;
		try {
			jedis = jedisPool.getResource();
			return jedis.get(key);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			jedis.close();
		}
		return key;
	}

	/**
	 * redis的累加机制 Author： Huang fengge Date:2016年3月29日
	 * 
	 * @param key
	 * @return
	 * @throws Exception
	 *             int
	 */
	public static int incrby(String key, long num) throws Exception {
		Jedis jedis = null;
		int len = 0;
		try {
			jedis = jedisPool.getResource();
			long l = jedis.incrBy(key, num);
			return len = (int) l;
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			jedis.close();
		}
		return len;
	}

	/**
	 * 通过下标和key删除List缓存某一个值 Author： Huang fengge Date:2016年3月29日
	 * 
	 * @param key
	 * @param count
	 * @param value
	 * @throws Exception
	 *             void
	 */
	public static void lrem(String key, long count, String value) throws Exception {
		Jedis jedis = null;
		try {
			jedis = jedisPool.getResource();
			jedis.lrem(key, count, value);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			jedis.close();
		}
	}

	/**
	 * reids获取列表然后删除这个列表的一个元素 Author： Huang fengge Date:2016年3月29日
	 * 
	 * @param key
	 * @return String
	 */
	public static String lpopListOne(final String key) {
		Jedis jedis = null;
		try {
			jedis = jedisPool.getResource();
			return jedis.lpop(key);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			jedis.close();
		}
		return key;
	}

	public static void main(String[] args) {
		try {
			    Jedis jedis =jedisPool.getResource();
			     System.out.println("list集合长度："+jedis.llen("tsx:list:testList"));
				 //获取并删除一个固定的值 （移除并获取列表最后一个元素）
				// System.err.println(jedis.rpop("tsx:list:testList"));
				 //获取list的长度
				 System.out.println("list集合长度："+jedis.llen("tsx:list:testList"));
				System.out.println(String.format("你好吗 [%s] ，下午咱们一起 [%s]", "李磊", "打羽毛球")); 
				 jedis.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}